{
    "cells": [
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "<center>\n",
                "    <p style=\"text-align:center\">\n",
                "        <img alt=\"phoenix logo\" src=\"https://storage.googleapis.com/arize-phoenix-assets/assets/phoenix-logo-light.svg\" width=\"200\"/>\n",
                "        <br>\n",
                "        <a href=\"https://docs.arize.com/phoenix/\">Docs</a>\n",
                "        |\n",
                "        <a href=\"https://github.com/Arize-ai/phoenix\">GitHub</a>\n",
                "        |\n",
                "        <a href=\"https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q\">Community</a>\n",
                "    </p>\n",
                "</center>\n",
                "<h1 align=\"center\">Human/GrondTruth Versus AI  Evals</h1>\n",
                "\n",
                "Arize provides tooling to evaluate LLM applications, including tools to determine whether AI answers match Human Groundtruth answers. In many Q&A systems its important to test the AI answer results as compared to Human answers prior to deployment. These help assess how often the answers are correctly generated by the AI system. \n",
                "\n",
                "The purpose of this notebook is:\n",
                "\n",
                "- to evaluate the performance of an LLM-assisted Evals for AI vs Human answers \n",
                "- to provide an experimental framework for users to iterate and improve on the default classification template.\n",
                "\n",
                "## Install Dependencies and Import Libraries"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 1,
            "metadata": {},
            "outputs": [],
            "source": [
                "!pip install -qq \"arize-phoenix-evals\" \"openai>=1\" ipython matplotlib pycm scikit-learn tiktoken"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 2,
            "metadata": {},
            "outputs": [],
            "source": [
                "import os\n",
                "from getpass import getpass\n",
                "\n",
                "import matplotlib.pyplot as plt\n",
                "import pandas as pd\n",
                "from phoenix.evals import (\n",
                "    HUMAN_VS_AI_PROMPT_RAILS_MAP,\n",
                "    HUMAN_VS_AI_PROMPT_TEMPLATE,\n",
                "    OpenAIModel,\n",
                "    llm_classify,\n",
                ")\n",
                "from pycm import ConfusionMatrix\n",
                "from sklearn.metrics import classification_report\n",
                "\n",
                "pd.set_option(\"display.max_colwidth\", None)"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## Download the Dataset\n",
                "\n",
                "We've crafted a dataset of common questions and answers about the Arize platform."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 3,
            "metadata": {},
            "outputs": [
                {
                    "data": {
                        "text/html": [
                            "<div>\n",
                            "<style scoped>\n",
                            "    .dataframe tbody tr th:only-of-type {\n",
                            "        vertical-align: middle;\n",
                            "    }\n",
                            "\n",
                            "    .dataframe tbody tr th {\n",
                            "        vertical-align: top;\n",
                            "    }\n",
                            "\n",
                            "    .dataframe thead th {\n",
                            "        text-align: right;\n",
                            "    }\n",
                            "</style>\n",
                            "<table border=\"1\" class=\"dataframe\">\n",
                            "  <thead>\n",
                            "    <tr style=\"text-align: right;\">\n",
                            "      <th></th>\n",
                            "      <th>Unnamed: 0</th>\n",
                            "      <th>question</th>\n",
                            "      <th>Out-of-doc</th>\n",
                            "      <th>Topic</th>\n",
                            "      <th>notes</th>\n",
                            "      <th>correct_answer</th>\n",
                            "      <th>ai_generated_answer</th>\n",
                            "      <th>human_ai_eval</th>\n",
                            "      <th>human_ai_explanation</th>\n",
                            "      <th>ai_answer</th>\n",
                            "      <th>true_value</th>\n",
                            "      <th>Who Answered?</th>\n",
                            "      <th>incorrect_answer</th>\n",
                            "      <th>ai_questions</th>\n",
                            "    </tr>\n",
                            "  </thead>\n",
                            "  <tbody>\n",
                            "    <tr>\n",
                            "      <th>0</th>\n",
                            "      <td>NaN</td>\n",
                            "      <td>Does Arize support total token usage tracking?</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>Arize supports tracking token usage both prompt and completion usage. Additionally costs can be calculated based on usage.</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>Arize supports tracking prompt and completion token usage.</td>\n",
                            "      <td>True</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>1</th>\n",
                            "      <td>NaN</td>\n",
                            "      <td>What is LLM Observability?</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>Large Language Model (LLMs) similar to traditional machine learning need production Observability for deployed sytems. Arguablly the LLMs have a wider range of possible actions. tend to be less predictable and have a wide range of potential output problems inclding hallcinations. Observability and LLM Evaluation plays a similar role in LLMs to surface issues, monitor for problems and iterate / improve on data. We need to understand when issues occur, where and why they happen and have the ability to quickly resolve and root cause issues.</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>LLM Observability is the ability to watch LLMs as they are put into produciton.</td>\n",
                            "      <td>False</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>2</th>\n",
                            "      <td>NaN</td>\n",
                            "      <td>What Evals are supported for LLMs or generative models?</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>Arize supports a suite of Evals available from the Phoenix Evals library, they include both pre-tested Evals and the ability to configure cusotm Evals. Some of the pre-tested LLM Evals are listed below:\\nRetrieval Relevance \\nQuestion and Answer \\nToxicity\\nHuman Groundtruth vs AI \\nCitation Reference Link Relevancy \\nCode Readability \\nHallucination Detection \\nSummarizaiton</td>\n",
                            "      <td>Arize supports LLM Evals.</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>Arize supports LLM Evals.</td>\n",
                            "      <td>False</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>3</th>\n",
                            "      <td>NaN</td>\n",
                            "      <td>Does Arize support tracing for LangChain and LlamaIndex LLM spans?</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>Arize supports tracking LLM span data from LlamaIndex and LangChain using the Arize OpenInference callback handler. We have one-click tracking support for both of those frameworks that capture trace data for embedding spans, retrieval spans, LLM spans, and chain spans.</td>\n",
                            "      <td>Arize supports tracking LLM span data from LlamaIndex and LangChain using the Arize OpenInference callback handler. We have one-click tracking support for both of those frameworks that capture trace data for embedding spans, retrieval spans, LLM spans, and chain spans.</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>Arize supports span tracking with LlamaIndex and LangChain, one-click tracing. The LLM span tracing includes tracking of the following span types:\\n- retrieval spans\\n- LLM Spans\\n- chain spans\\n-embedding spans</td>\n",
                            "      <td>True</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>4</th>\n",
                            "      <td>NaN</td>\n",
                            "      <td>How do I use the SDK to upload a ranking model?</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>A ranking model is integrated into the SDK where each row is an item in the ranked list. The three fields that need to be integrated are rank, relevance_score and prediction_group_id. The \"rank\" determines the rank number of this item in the list. The relevance_score represents the estimated probability of clicking on that item. The prediction_group_id groups the ranked items into a list, representing the set for a speciifc query.</td>\n",
                            "      <td>To upload a ranking model using the SDK, you would typically follow these steps:\\n\\n1. Install the SDK in your Python environment if you haven't already done so.\\n2. Import the SDK into your Python script where you plan to upload the model data.\\n3. Configure the SDK with your Arize API key and space key to authenticate your requests.\\n4. Define your model schema, including fields like `rank`, `prediction_score`, and `prediction_group_id`.\\n5. Use the SDK functions to log model predictions, actuals, and any additional metadata related to your ranking model.\\n6. Once your data is prepared, call the appropriate function provided by the SDK to send your ranking model data to the Arize platform.\\n\\nThe exact function names and parameters may vary based on the SDK version and the specifics of the ranking model you are working with. You should refer to the SDK documentation for detailed instructions on logging model schemas and sending data to the Arize platform.</td>\n",
                            "      <td>incorrect</td>\n",
                            "      <td>The AI answer provides a general process of uploading a model using an SDK, but it does not specifically address the question about uploading a ranking model. The human answer provides specific details about the fields that need to be integrated into the SDK for a ranking model, which are not mentioned in the AI answer.</td>\n",
                            "      <td>To upload a ranking model using the SDK, you would typically follow these steps:\\n\\n1. Install the SDK in your Python environment if you haven't already done so.\\n2. Import the SDK into your Python script where you plan to upload the model data.\\n3. Configure the SDK with your Arize API key and space key to authenticate your requests.\\n4. Define your model schema, including fields like `rank`, `prediction_score`, and `prediction_group_id`.\\n5. Use the SDK functions to log model predictions, actuals, and any additional metadata related to your ranking model.\\n6. Once your data is prepared, call the appropriate function provided by the SDK to send your ranking model data to the Arize platform.\\n\\nThe exact function names and parameters may vary based on the SDK version and the specifics of the ranking model you are working with. You should refer to the SDK documentation for detailed instructions on logging model schemas and sending data to the Arize platform.</td>\n",
                            "      <td>False</td>\n",
                            "      <td>Jason</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>How do I use the SDK to upload a ranking model?</td>\n",
                            "    </tr>\n",
                            "  </tbody>\n",
                            "</table>\n",
                            "</div>"
                        ],
                        "text/plain": [
                            "   Unnamed: 0  \\\n",
                            "0         NaN   \n",
                            "1         NaN   \n",
                            "2         NaN   \n",
                            "3         NaN   \n",
                            "4         NaN   \n",
                            "\n",
                            "                                                             question  \\\n",
                            "0                      Does Arize support total token usage tracking?   \n",
                            "1                                          What is LLM Observability?   \n",
                            "2             What Evals are supported for LLMs or generative models?   \n",
                            "3  Does Arize support tracing for LangChain and LlamaIndex LLM spans?   \n",
                            "4                     How do I use the SDK to upload a ranking model?   \n",
                            "\n",
                            "   Out-of-doc Topic notes  \\\n",
                            "0         NaN   NaN   NaN   \n",
                            "1         NaN   NaN   NaN   \n",
                            "2         NaN   NaN   NaN   \n",
                            "3         NaN   NaN   NaN   \n",
                            "4         NaN   NaN   NaN   \n",
                            "\n",
                            "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    correct_answer  \\\n",
                            "0                                                                                                                                                                                                                                                                                                                                                                                                                                       Arize supports tracking token usage both prompt and completion usage. Additionally costs can be calculated based on usage.   \n",
                            "1  Large Language Model (LLMs) similar to traditional machine learning need production Observability for deployed sytems. Arguablly the LLMs have a wider range of possible actions. tend to be less predictable and have a wide range of potential output problems inclding hallcinations. Observability and LLM Evaluation plays a similar role in LLMs to surface issues, monitor for problems and iterate / improve on data. We need to understand when issues occur, where and why they happen and have the ability to quickly resolve and root cause issues.   \n",
                            "2                                                                                                                                                                      Arize supports a suite of Evals available from the Phoenix Evals library, they include both pre-tested Evals and the ability to configure cusotm Evals. Some of the pre-tested LLM Evals are listed below:\\nRetrieval Relevance \\nQuestion and Answer \\nToxicity\\nHuman Groundtruth vs AI \\nCitation Reference Link Relevancy \\nCode Readability \\nHallucination Detection \\nSummarizaiton    \n",
                            "3                                                                                                                                                                                                                                                                                    Arize supports tracking LLM span data from LlamaIndex and LangChain using the Arize OpenInference callback handler. We have one-click tracking support for both of those frameworks that capture trace data for embedding spans, retrieval spans, LLM spans, and chain spans.   \n",
                            "4                                                                                                              A ranking model is integrated into the SDK where each row is an item in the ranked list. The three fields that need to be integrated are rank, relevance_score and prediction_group_id. The \"rank\" determines the rank number of this item in the list. The relevance_score represents the estimated probability of clicking on that item. The prediction_group_id groups the ranked items into a list, representing the set for a speciifc query.    \n",
                            "\n",
                            "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           ai_generated_answer  \\\n",
                            "0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          NaN   \n",
                            "1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          NaN   \n",
                            "2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    Arize supports LLM Evals.   \n",
                            "3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Arize supports tracking LLM span data from LlamaIndex and LangChain using the Arize OpenInference callback handler. We have one-click tracking support for both of those frameworks that capture trace data for embedding spans, retrieval spans, LLM spans, and chain spans.   \n",
                            "4  To upload a ranking model using the SDK, you would typically follow these steps:\\n\\n1. Install the SDK in your Python environment if you haven't already done so.\\n2. Import the SDK into your Python script where you plan to upload the model data.\\n3. Configure the SDK with your Arize API key and space key to authenticate your requests.\\n4. Define your model schema, including fields like `rank`, `prediction_score`, and `prediction_group_id`.\\n5. Use the SDK functions to log model predictions, actuals, and any additional metadata related to your ranking model.\\n6. Once your data is prepared, call the appropriate function provided by the SDK to send your ranking model data to the Arize platform.\\n\\nThe exact function names and parameters may vary based on the SDK version and the specifics of the ranking model you are working with. You should refer to the SDK documentation for detailed instructions on logging model schemas and sending data to the Arize platform.   \n",
                            "\n",
                            "  human_ai_eval  \\\n",
                            "0           NaN   \n",
                            "1           NaN   \n",
                            "2           NaN   \n",
                            "3           NaN   \n",
                            "4     incorrect   \n",
                            "\n",
                            "                                                                                                                                                                                                                                                                                                                human_ai_explanation  \\\n",
                            "0                                                                                                                                                                                                                                                                                                                                NaN   \n",
                            "1                                                                                                                                                                                                                                                                                                                                NaN   \n",
                            "2                                                                                                                                                                                                                                                                                                                                NaN   \n",
                            "3                                                                                                                                                                                                                                                                                                                                NaN   \n",
                            "4  The AI answer provides a general process of uploading a model using an SDK, but it does not specifically address the question about uploading a ranking model. The human answer provides specific details about the fields that need to be integrated into the SDK for a ranking model, which are not mentioned in the AI answer.   \n",
                            "\n",
                            "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     ai_answer  \\\n",
                            "0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   Arize supports tracking prompt and completion token usage.   \n",
                            "1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             LLM Observability is the ability to watch LLMs as they are put into produciton.    \n",
                            "2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    Arize supports LLM Evals.   \n",
                            "3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          Arize supports span tracking with LlamaIndex and LangChain, one-click tracing. The LLM span tracing includes tracking of the following span types:\\n- retrieval spans\\n- LLM Spans\\n- chain spans\\n-embedding spans   \n",
                            "4  To upload a ranking model using the SDK, you would typically follow these steps:\\n\\n1. Install the SDK in your Python environment if you haven't already done so.\\n2. Import the SDK into your Python script where you plan to upload the model data.\\n3. Configure the SDK with your Arize API key and space key to authenticate your requests.\\n4. Define your model schema, including fields like `rank`, `prediction_score`, and `prediction_group_id`.\\n5. Use the SDK functions to log model predictions, actuals, and any additional metadata related to your ranking model.\\n6. Once your data is prepared, call the appropriate function provided by the SDK to send your ranking model data to the Arize platform.\\n\\nThe exact function names and parameters may vary based on the SDK version and the specifics of the ranking model you are working with. You should refer to the SDK documentation for detailed instructions on logging model schemas and sending data to the Arize platform.   \n",
                            "\n",
                            "  true_value Who Answered? incorrect_answer  \\\n",
                            "0       True           NaN              NaN   \n",
                            "1      False           NaN              NaN   \n",
                            "2      False           NaN              NaN   \n",
                            "3       True           NaN              NaN   \n",
                            "4      False         Jason              NaN   \n",
                            "\n",
                            "                                      ai_questions  \n",
                            "0                                              NaN  \n",
                            "1                                              NaN  \n",
                            "2                                              NaN  \n",
                            "3                                              NaN  \n",
                            "4  How do I use the SDK to upload a ranking model?  "
                        ]
                    },
                    "execution_count": 3,
                    "metadata": {},
                    "output_type": "execute_result"
                }
            ],
            "source": [
                "csv_file_path = \"https://storage.googleapis.com/arize-phoenix-assets/evals/human_vs_ai/human_vs_ai_classifications.csv\"\n",
                "\n",
                "# Read the CSV file into a DataFrame\n",
                "df = pd.read_csv(csv_file_path).dropna(subset=[\"correct_answer\"]).reset_index(drop=True)\n",
                "df.head()"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "##  Vizualization of Prompts/Templates Evals in Phoenix (Optional Section)\n",
                "\n",
                "Visualization of Evals is not required but can be helpful to see the actual calls to the LLM. \n",
                "The link below starts the Phoenix UI/server and is a link to Phoenix running locally"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 4,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "🌍 To view the Phoenix app in your browser, visit http://localhost:6006/\n",
                        "📺 To view the Phoenix app in a notebook, run `px.active_session().view()`\n",
                        "📖 For more information on how to use Phoenix, check out https://docs.arize.com/phoenix\n"
                    ]
                }
            ],
            "source": [
                "import phoenix as px\n",
                "from phoenix.trace.openai import OpenAIInstrumentor\n",
                "\n",
                "px.launch_app()\n",
                "\n",
                "OpenAIInstrumentor().instrument()"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## Human vs AI Template\n",
                "\n",
                "View the default template used to evaluate the AI answers."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 5,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "\n",
                        "You are comparing a human ground truth answer from an expert to an answer from an AI model.\n",
                        "Your goal is to determine if the AI answer correctly matches, in substance, the human answer.\n",
                        "    [BEGIN DATA]\n",
                        "    ************\n",
                        "    [Question]: {question}\n",
                        "    ************\n",
                        "    [Human Ground Truth Answer]: {correct_answer}\n",
                        "    ************\n",
                        "    [AI Answer]: {ai_generated_answer}\n",
                        "    ************\n",
                        "    [END DATA]\n",
                        "Compare the AI answer to the human ground truth answer, if the AI correctly answers the question,\n",
                        "then the AI answer is \"correct\". If the AI answer is longer but contains the main idea of the\n",
                        "Human answer please answer \"correct\". If the AI answer divergences or does not contain the main\n",
                        "idea of the human answer, please answer \"incorrect\".\n",
                        "\n"
                    ]
                }
            ],
            "source": [
                "print(HUMAN_VS_AI_PROMPT_TEMPLATE)"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "The template variables are:\n",
                "\n",
                "- **question:** the question asked by a user\n",
                "- **correct_answer:** human labeled correct answer \n",
                "- **ai_answer:** AI generated answer"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## Configure the LLM\n",
                "\n",
                "Configure your OpenAI API key."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 6,
            "metadata": {},
            "outputs": [],
            "source": [
                "if not (openai_api_key := os.getenv(\"OPENAI_API_KEY\")):\n",
                "    openai_api_key = getpass(\"🔑 Enter your OpenAI API key: \")\n",
                "os.environ[\"OPENAI_API_KEY\"] = openai_api_key"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## LLM Evals:Human Groundtruth vs AI GPT-4\n",
                "Run Human vs AI Eval against a subset of the data.\n",
                "Instantiate the LLM and set parameters."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 7,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
                    ]
                }
            ],
            "source": [
                "model = OpenAIModel(\n",
                "    model_name=\"gpt-4\",\n",
                "    temperature=0.0,\n",
                ")"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 8,
            "metadata": {},
            "outputs": [
                {
                    "data": {
                        "text/plain": [
                            "\"Hello! I'm working perfectly. How can I assist you today?\""
                        ]
                    },
                    "execution_count": 8,
                    "metadata": {},
                    "output_type": "execute_result"
                }
            ],
            "source": [
                "model(\"Hello world, this is a test if you are working?\")"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## Classifications with explanations\n",
                "\n",
                "When evaluating a dataset for relevance, it can be useful to know why the LLM classified an AI answer as relevant or irrelevant. The following code block runs `llm_classify` with explanations turned on so that we can inspect why the LLM made the classification it did. There is speed tradeoff since more tokens is being generated but it can be highly informative when troubleshooting."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 9,
            "metadata": {},
            "outputs": [
                {
                    "data": {
                        "application/vnd.jupyter.widget-view+json": {
                            "model_id": "ece977d24fd84acfa7b5f4259f4b7069",
                            "version_major": 2,
                            "version_minor": 0
                        },
                        "text/plain": [
                            "llm_classify |          | 0/119 (0.0%) | ⏳ 00:00<? | ?it/s"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "import nest_asyncio\n",
                "\n",
                "nest_asyncio.apply()\n",
                "# The rails is used to hold the output to specific values based on the template\n",
                "# It will remove text such as \",,,\" or \"...\"\n",
                "# Will ensure the binary value expected from the template is returned\n",
                "rails = list(HUMAN_VS_AI_PROMPT_RAILS_MAP.values())\n",
                "relevance_classifications = llm_classify(\n",
                "    dataframe=df,\n",
                "    template=HUMAN_VS_AI_PROMPT_TEMPLATE,\n",
                "    model=model,\n",
                "    rails=rails,\n",
                "    verbose=False,\n",
                "    provide_explanation=True,\n",
                "    concurrency=50,\n",
                ")"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 10,
            "metadata": {},
            "outputs": [
                {
                    "data": {
                        "text/html": [
                            "<div>\n",
                            "<style scoped>\n",
                            "    .dataframe tbody tr th:only-of-type {\n",
                            "        vertical-align: middle;\n",
                            "    }\n",
                            "\n",
                            "    .dataframe tbody tr th {\n",
                            "        vertical-align: top;\n",
                            "    }\n",
                            "\n",
                            "    .dataframe thead th {\n",
                            "        text-align: right;\n",
                            "    }\n",
                            "</style>\n",
                            "<table border=\"1\" class=\"dataframe\">\n",
                            "  <thead>\n",
                            "    <tr style=\"text-align: right;\">\n",
                            "      <th></th>\n",
                            "      <th>question</th>\n",
                            "      <th>correct_answer</th>\n",
                            "      <th>ai_generated_answer</th>\n",
                            "      <th>label</th>\n",
                            "      <th>explanation</th>\n",
                            "    </tr>\n",
                            "  </thead>\n",
                            "  <tbody>\n",
                            "    <tr>\n",
                            "      <th>0</th>\n",
                            "      <td>Does Arize support total token usage tracking?</td>\n",
                            "      <td>Arize supports tracking token usage both prompt and completion usage. Additionally costs can be calculated based on usage.</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>incorrect</td>\n",
                            "      <td>The AI answer is 'nan', which is a placeholder for missing or undefined data. This means that the AI did not provide any answer to the question. The human ground truth answer provides information about Arize's support for tracking token usage, both prompt and completion usage, and the ability to calculate costs based on usage. Since the AI did not provide any relevant information in response to the question, it does not match the substance of the human answer.</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>1</th>\n",
                            "      <td>What is LLM Observability?</td>\n",
                            "      <td>Large Language Model (LLMs) similar to traditional machine learning need production Observability for deployed sytems. Arguablly the LLMs have a wider range of possible actions. tend to be less predictable and have a wide range of potential output problems inclding hallcinations. Observability and LLM Evaluation plays a similar role in LLMs to surface issues, monitor for problems and iterate / improve on data. We need to understand when issues occur, where and why they happen and have the ability to quickly resolve and root cause issues.</td>\n",
                            "      <td>NaN</td>\n",
                            "      <td>incorrect</td>\n",
                            "      <td>First, we need to compare the AI answer to the human ground truth answer. In this case, the AI answer is 'nan', which is not a valid response. It does not provide any information about LLM Observability. On the other hand, the human ground truth answer provides a detailed explanation of LLM Observability, stating that it is necessary for monitoring and improving deployed systems, especially Large Language Models (LLMs). The AI answer does not match the human answer in substance, and it does not answer the question at all. Therefore, the AI answer is incorrect.</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>2</th>\n",
                            "      <td>What Evals are supported for LLMs or generative models?</td>\n",
                            "      <td>Arize supports a suite of Evals available from the Phoenix Evals library, they include both pre-tested Evals and the ability to configure cusotm Evals. Some of the pre-tested LLM Evals are listed below:\\nRetrieval Relevance \\nQuestion and Answer \\nToxicity\\nHuman Groundtruth vs AI \\nCitation Reference Link Relevancy \\nCode Readability \\nHallucination Detection \\nSummarizaiton</td>\n",
                            "      <td>Arize supports LLM Evals.</td>\n",
                            "      <td>incorrect</td>\n",
                            "      <td>The AI answer is very brief and does not provide the detailed information that the human ground truth answer provides. The human answer lists specific Evals that are supported for LLMs or generative models, while the AI answer simply states that Arize supports LLM Evals without specifying which ones. Therefore, the AI answer does not contain the main idea of the human answer.</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>3</th>\n",
                            "      <td>Does Arize support tracing for LangChain and LlamaIndex LLM spans?</td>\n",
                            "      <td>Arize supports tracking LLM span data from LlamaIndex and LangChain using the Arize OpenInference callback handler. We have one-click tracking support for both of those frameworks that capture trace data for embedding spans, retrieval spans, LLM spans, and chain spans.</td>\n",
                            "      <td>Arize supports tracking LLM span data from LlamaIndex and LangChain using the Arize OpenInference callback handler. We have one-click tracking support for both of those frameworks that capture trace data for embedding spans, retrieval spans, LLM spans, and chain spans.</td>\n",
                            "      <td>correct</td>\n",
                            "      <td>First, I read both the human ground truth answer and the AI answer carefully. I noticed that both answers are identical, word for word. They both state that Arize supports tracking LLM span data from LlamaIndex and LangChain using the Arize OpenInference callback handler, and that there is one-click tracking support for both of those frameworks that capture trace data for embedding spans, retrieval spans, LLM spans, and chain spans. Because the AI answer is exactly the same as the human answer, it contains all the information and main ideas from the human answer.</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>4</th>\n",
                            "      <td>How do I use the SDK to upload a ranking model?</td>\n",
                            "      <td>A ranking model is integrated into the SDK where each row is an item in the ranked list. The three fields that need to be integrated are rank, relevance_score and prediction_group_id. The \"rank\" determines the rank number of this item in the list. The relevance_score represents the estimated probability of clicking on that item. The prediction_group_id groups the ranked items into a list, representing the set for a speciifc query.</td>\n",
                            "      <td>To upload a ranking model using the SDK, you would typically follow these steps:\\n\\n1. Install the SDK in your Python environment if you haven't already done so.\\n2. Import the SDK into your Python script where you plan to upload the model data.\\n3. Configure the SDK with your Arize API key and space key to authenticate your requests.\\n4. Define your model schema, including fields like `rank`, `prediction_score`, and `prediction_group_id`.\\n5. Use the SDK functions to log model predictions, actuals, and any additional metadata related to your ranking model.\\n6. Once your data is prepared, call the appropriate function provided by the SDK to send your ranking model data to the Arize platform.\\n\\nThe exact function names and parameters may vary based on the SDK version and the specifics of the ranking model you are working with. You should refer to the SDK documentation for detailed instructions on logging model schemas and sending data to the Arize platform.</td>\n",
                            "      <td>incorrect</td>\n",
                            "      <td>The AI answer provides a detailed step-by-step guide on how to upload a ranking model using the SDK, which is the question asked. However, it does not mention the specific fields 'rank', 'relevance_score', and 'prediction_group_id' that the human ground truth answer specifies as necessary for the integration of a ranking model into the SDK. The AI answer instead mentions 'rank', 'prediction_score', and 'prediction_group_id'. While 'rank' and 'prediction_group_id' match, 'prediction_score' does not match 'relevance_score'. Therefore, the AI answer does not fully match the substance of the human answer.</td>\n",
                            "    </tr>\n",
                            "  </tbody>\n",
                            "</table>\n",
                            "</div>"
                        ],
                        "text/plain": [
                            "                                                             question  \\\n",
                            "0                      Does Arize support total token usage tracking?   \n",
                            "1                                          What is LLM Observability?   \n",
                            "2             What Evals are supported for LLMs or generative models?   \n",
                            "3  Does Arize support tracing for LangChain and LlamaIndex LLM spans?   \n",
                            "4                     How do I use the SDK to upload a ranking model?   \n",
                            "\n",
                            "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    correct_answer  \\\n",
                            "0                                                                                                                                                                                                                                                                                                                                                                                                                                       Arize supports tracking token usage both prompt and completion usage. Additionally costs can be calculated based on usage.   \n",
                            "1  Large Language Model (LLMs) similar to traditional machine learning need production Observability for deployed sytems. Arguablly the LLMs have a wider range of possible actions. tend to be less predictable and have a wide range of potential output problems inclding hallcinations. Observability and LLM Evaluation plays a similar role in LLMs to surface issues, monitor for problems and iterate / improve on data. We need to understand when issues occur, where and why they happen and have the ability to quickly resolve and root cause issues.   \n",
                            "2                                                                                                                                                                      Arize supports a suite of Evals available from the Phoenix Evals library, they include both pre-tested Evals and the ability to configure cusotm Evals. Some of the pre-tested LLM Evals are listed below:\\nRetrieval Relevance \\nQuestion and Answer \\nToxicity\\nHuman Groundtruth vs AI \\nCitation Reference Link Relevancy \\nCode Readability \\nHallucination Detection \\nSummarizaiton    \n",
                            "3                                                                                                                                                                                                                                                                                    Arize supports tracking LLM span data from LlamaIndex and LangChain using the Arize OpenInference callback handler. We have one-click tracking support for both of those frameworks that capture trace data for embedding spans, retrieval spans, LLM spans, and chain spans.   \n",
                            "4                                                                                                              A ranking model is integrated into the SDK where each row is an item in the ranked list. The three fields that need to be integrated are rank, relevance_score and prediction_group_id. The \"rank\" determines the rank number of this item in the list. The relevance_score represents the estimated probability of clicking on that item. The prediction_group_id groups the ranked items into a list, representing the set for a speciifc query.    \n",
                            "\n",
                            "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           ai_generated_answer  \\\n",
                            "0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          NaN   \n",
                            "1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          NaN   \n",
                            "2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    Arize supports LLM Evals.   \n",
                            "3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Arize supports tracking LLM span data from LlamaIndex and LangChain using the Arize OpenInference callback handler. We have one-click tracking support for both of those frameworks that capture trace data for embedding spans, retrieval spans, LLM spans, and chain spans.   \n",
                            "4  To upload a ranking model using the SDK, you would typically follow these steps:\\n\\n1. Install the SDK in your Python environment if you haven't already done so.\\n2. Import the SDK into your Python script where you plan to upload the model data.\\n3. Configure the SDK with your Arize API key and space key to authenticate your requests.\\n4. Define your model schema, including fields like `rank`, `prediction_score`, and `prediction_group_id`.\\n5. Use the SDK functions to log model predictions, actuals, and any additional metadata related to your ranking model.\\n6. Once your data is prepared, call the appropriate function provided by the SDK to send your ranking model data to the Arize platform.\\n\\nThe exact function names and parameters may vary based on the SDK version and the specifics of the ranking model you are working with. You should refer to the SDK documentation for detailed instructions on logging model schemas and sending data to the Arize platform.   \n",
                            "\n",
                            "       label  \\\n",
                            "0  incorrect   \n",
                            "1  incorrect   \n",
                            "2  incorrect   \n",
                            "3    correct   \n",
                            "4  incorrect   \n",
                            "\n",
                            "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        explanation  \n",
                            "0                                                                                                                                                  The AI answer is 'nan', which is a placeholder for missing or undefined data. This means that the AI did not provide any answer to the question. The human ground truth answer provides information about Arize's support for tracking token usage, both prompt and completion usage, and the ability to calculate costs based on usage. Since the AI did not provide any relevant information in response to the question, it does not match the substance of the human answer.  \n",
                            "1                                            First, we need to compare the AI answer to the human ground truth answer. In this case, the AI answer is 'nan', which is not a valid response. It does not provide any information about LLM Observability. On the other hand, the human ground truth answer provides a detailed explanation of LLM Observability, stating that it is necessary for monitoring and improving deployed systems, especially Large Language Models (LLMs). The AI answer does not match the human answer in substance, and it does not answer the question at all. Therefore, the AI answer is incorrect.  \n",
                            "2                                                                                                                                                                                                                                        The AI answer is very brief and does not provide the detailed information that the human ground truth answer provides. The human answer lists specific Evals that are supported for LLMs or generative models, while the AI answer simply states that Arize supports LLM Evals without specifying which ones. Therefore, the AI answer does not contain the main idea of the human answer.  \n",
                            "3                                         First, I read both the human ground truth answer and the AI answer carefully. I noticed that both answers are identical, word for word. They both state that Arize supports tracking LLM span data from LlamaIndex and LangChain using the Arize OpenInference callback handler, and that there is one-click tracking support for both of those frameworks that capture trace data for embedding spans, retrieval spans, LLM spans, and chain spans. Because the AI answer is exactly the same as the human answer, it contains all the information and main ideas from the human answer.  \n",
                            "4  The AI answer provides a detailed step-by-step guide on how to upload a ranking model using the SDK, which is the question asked. However, it does not mention the specific fields 'rank', 'relevance_score', and 'prediction_group_id' that the human ground truth answer specifies as necessary for the integration of a ranking model into the SDK. The AI answer instead mentions 'rank', 'prediction_score', and 'prediction_group_id'. While 'rank' and 'prediction_group_id' match, 'prediction_score' does not match 'relevance_score'. Therefore, the AI answer does not fully match the substance of the human answer.  "
                        ]
                    },
                    "execution_count": 10,
                    "metadata": {},
                    "output_type": "execute_result"
                }
            ],
            "source": [
                "# Let's view the data\n",
                "merged_df = pd.merge(df, relevance_classifications, left_index=True, right_index=True)\n",
                "merged_df[[\"question\", \"correct_answer\", \"ai_generated_answer\", \"label\", \"explanation\"]].head()"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## Evaluate Classifications\n",
                "\n",
                "Evaluate the predictions against human-labeled ground-truth relevance labels."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 11,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "              precision    recall  f1-score   support\n",
                        "\n",
                        "     correct       0.92      0.71      0.80        78\n",
                        "   incorrect       0.59      0.90      0.71        39\n",
                        "\n",
                        "   micro avg       0.76      0.77      0.76       117\n",
                        "   macro avg       0.75      0.80      0.76       117\n",
                        "weighted avg       0.81      0.77      0.77       117\n",
                        "\n"
                    ]
                },
                {
                    "data": {
                        "text/plain": [
                            "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
                        ]
                    },
                    "execution_count": 11,
                    "metadata": {},
                    "output_type": "execute_result"
                },
                {
                    "data": {
                        "image/png": "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",
                        "text/plain": [
                            "<Figure size 640x480 with 2 Axes>"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "true_labels = df[\"true_value\"].map(HUMAN_VS_AI_PROMPT_RAILS_MAP).tolist()\n",
                "\n",
                "print(classification_report(true_labels, relevance_classifications[\"label\"], labels=rails))\n",
                "confusion_matrix = ConfusionMatrix(\n",
                "    actual_vector=list(true_labels),\n",
                "    predict_vector=list(relevance_classifications[\"label\"]),\n",
                "    classes=rails,\n",
                ")\n",
                "confusion_matrix.plot(\n",
                "    cmap=plt.colormaps[\"Blues\"],\n",
                "    number_label=True,\n",
                "    normalized=True,\n",
                ")"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## LLM Evals: Human Groundtruth vs AI  Classifications GPT-3.5 Turbo\n",
                "Run against a subset of the data using GPT-3.5. GPT-3.5 can significantly speed up the classification process. However there are tradeoffs as  we will see below."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 12,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
                    ]
                }
            ],
            "source": [
                "model = OpenAIModel(model_name=\"gpt-3.5-turbo\", temperature=0.0, request_timeout=20)"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": []
        },
        {
            "cell_type": "code",
            "execution_count": 13,
            "metadata": {},
            "outputs": [
                {
                    "data": {
                        "application/vnd.jupyter.widget-view+json": {
                            "model_id": "da8c1814b7ba4a1da3e196ea7a4b43d0",
                            "version_major": 2,
                            "version_minor": 0
                        },
                        "text/plain": [
                            "llm_classify |          | 0/119 (0.0%) | ⏳ 00:00<? | ?it/s"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "rails = list(HUMAN_VS_AI_PROMPT_RAILS_MAP.values())\n",
                "relevance_classifications_df = llm_classify(\n",
                "    dataframe=df,\n",
                "    template=HUMAN_VS_AI_PROMPT_TEMPLATE,\n",
                "    model=model,\n",
                "    rails=rails,\n",
                "    concurrency=50,\n",
                "    provide_explanation=True,\n",
                ")"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 14,
            "metadata": {},
            "outputs": [
                {
                    "data": {
                        "text/html": [
                            "<div>\n",
                            "<style scoped>\n",
                            "    .dataframe tbody tr th:only-of-type {\n",
                            "        vertical-align: middle;\n",
                            "    }\n",
                            "\n",
                            "    .dataframe tbody tr th {\n",
                            "        vertical-align: top;\n",
                            "    }\n",
                            "\n",
                            "    .dataframe thead th {\n",
                            "        text-align: right;\n",
                            "    }\n",
                            "</style>\n",
                            "<table border=\"1\" class=\"dataframe\">\n",
                            "  <thead>\n",
                            "    <tr style=\"text-align: right;\">\n",
                            "      <th></th>\n",
                            "      <th>label</th>\n",
                            "      <th>explanation</th>\n",
                            "    </tr>\n",
                            "  </thead>\n",
                            "  <tbody>\n",
                            "    <tr>\n",
                            "      <th>0</th>\n",
                            "      <td>incorrect</td>\n",
                            "      <td>The AI answer is 'nan' which stands for 'not a number' and does not provide any relevant information related to the question. In order to determine if the AI answer is relevant or irrelevant, we need to compare it to the human ground truth answer and see if it addresses the question about Arize supporting total token usage tracking.</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>1</th>\n",
                            "      <td>incorrect</td>\n",
                            "      <td>The AI answer is 'nan', which stands for 'not a number' and does not provide any relevant information related to the question about LLM Observability. To determine if the AI answer is relevant or irrelevant, we need to compare it to the human ground truth answer and see if it contains any meaningful content related to the topic. In this case, the AI answer is completely irrelevant as it does not address the question at all.</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>2</th>\n",
                            "      <td>correct</td>\n",
                            "      <td>The human ground truth answer provides a detailed list of pre-tested LLM Evals supported by Arize, including Retrieval Relevance, Question and Answer, Toxicity, Human Groundtruth vs AI, Citation Reference Link Relevancy, Code Readability, Hallucination Detection, and Summarization. The AI answer, 'Arize supports LLM Evals,' is a concise summary that captures the main idea of the human answer. While it does not list out all the specific Evals, it conveys the general support for LLM Evals by Arize.</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>3</th>\n",
                            "      <td>correct</td>\n",
                            "      <td>The AI answer matches the human ground truth answer word for word, indicating that it is relevant and accurate in substance.</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>4</th>\n",
                            "      <td>correct</td>\n",
                            "      <td>The AI answer provides a step-by-step guide on how to upload a ranking model using the SDK. It includes instructions on installing the SDK, configuring it with API keys, defining the model schema, logging model predictions, and sending data to the Arize platform. While the AI answer does not directly match the detailed explanation of integrating a ranking model with specific fields like rank, relevance_score, and prediction_group_id, it covers the general process of uploading a ranking model using the SDK.</td>\n",
                            "    </tr>\n",
                            "  </tbody>\n",
                            "</table>\n",
                            "</div>"
                        ],
                        "text/plain": [
                            "       label  \\\n",
                            "0  incorrect   \n",
                            "1  incorrect   \n",
                            "2    correct   \n",
                            "3    correct   \n",
                            "4    correct   \n",
                            "\n",
                            "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       explanation  \n",
                            "0                                                                                                                                                                                   The AI answer is 'nan' which stands for 'not a number' and does not provide any relevant information related to the question. In order to determine if the AI answer is relevant or irrelevant, we need to compare it to the human ground truth answer and see if it addresses the question about Arize supporting total token usage tracking.  \n",
                            "1                                                                                      The AI answer is 'nan', which stands for 'not a number' and does not provide any relevant information related to the question about LLM Observability. To determine if the AI answer is relevant or irrelevant, we need to compare it to the human ground truth answer and see if it contains any meaningful content related to the topic. In this case, the AI answer is completely irrelevant as it does not address the question at all.  \n",
                            "2            The human ground truth answer provides a detailed list of pre-tested LLM Evals supported by Arize, including Retrieval Relevance, Question and Answer, Toxicity, Human Groundtruth vs AI, Citation Reference Link Relevancy, Code Readability, Hallucination Detection, and Summarization. The AI answer, 'Arize supports LLM Evals,' is a concise summary that captures the main idea of the human answer. While it does not list out all the specific Evals, it conveys the general support for LLM Evals by Arize.  \n",
                            "3                                                                                                                                                                                                                                                                                                                                                                                                     The AI answer matches the human ground truth answer word for word, indicating that it is relevant and accurate in substance.  \n",
                            "4  The AI answer provides a step-by-step guide on how to upload a ranking model using the SDK. It includes instructions on installing the SDK, configuring it with API keys, defining the model schema, logging model predictions, and sending data to the Arize platform. While the AI answer does not directly match the detailed explanation of integrating a ranking model with specific fields like rank, relevance_score, and prediction_group_id, it covers the general process of uploading a ranking model using the SDK.  "
                        ]
                    },
                    "execution_count": 14,
                    "metadata": {},
                    "output_type": "execute_result"
                }
            ],
            "source": [
                "relevance_classifications_df.head()"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 15,
            "metadata": {},
            "outputs": [],
            "source": [
                "relevance_classifications = relevance_classifications_df[\"label\"].tolist()"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 16,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "              precision    recall  f1-score   support\n",
                        "\n",
                        "     correct       0.72      0.92      0.81        78\n",
                        "   incorrect       0.63      0.31      0.41        39\n",
                        "\n",
                        "   micro avg       0.71      0.72      0.71       117\n",
                        "   macro avg       0.68      0.62      0.61       117\n",
                        "weighted avg       0.69      0.72      0.68       117\n",
                        "\n"
                    ]
                },
                {
                    "data": {
                        "text/plain": [
                            "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
                        ]
                    },
                    "execution_count": 16,
                    "metadata": {},
                    "output_type": "execute_result"
                },
                {
                    "data": {
                        "image/png": "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P/6InJwcHD58GBKJBACwb98+9O7dG9988w0aN26Mq1evYsCAAQCefyrxxo0bMWfOHPz000+oXbs2kpOTcfLkyVfeJxEVg0BEZS40NFTo0KGDIAiCoFQqhR07dghGRkbCiBEjxPN2dnZCdna2eM2qVasEd3d3QalUimXZ2dmCsbGxsG3bNkEQBMHBwUGYPn26eD43N1eoUqWK2JcgCEJgYKAwZMgQQRAE4eLFiwIAYceOHWrj3L17twBAePDggVj27NkzwcTERDhw4IBK3b59+wrdunUTBEEQxowZI3h6eqqcHz16dKG2XvT1118LAIT79++rPf+qmF7Wtm1bYfjw4YIgCMKxY8cEAML169cL1bt3754AQNizZ4/adlq0aCFMmzZNpWzVqlWCg4ODIAiCMGvWLKFmzZpCTk7OK2MmIs1wZIVIR/z+++8wMzNDbm4ulEolunfvjqioKPG8l5cX5HK5+PXJkydx5cqVQutNnj17hqtXr+LRo0e4e/cu/P39xXMGBgbw8/MrNBVUICEhATKZDIGBgcWO+8qVK3jy5AlatmypUp6Tk4O6desCAM6fP68SBwAEBAS8st2iYnyd/Px8TJs2DT///DNu376NnJwcZGdnw8TEBADg7e2NFi1awMvLC8HBwWjVqhU6d+4MKysrWFtbo0+fPggODkbLli0RFBSEjz/+GA4ODgCev+b79+/H1KlTVfp79uwZnjx5go8++ggxMTGoXr06WrdujTZt2qB9+/YwMOB/tUQlwX9BRDqiWbNmWLBgAeRyOSpXrlzoF5ypqanK15mZmfD19cWaNWsKtWVra/tGMRRM62giMzMTALB161Y4OjqqnDMyMnqjOACgZs2aAIALFy68NrF50YwZMzB37lzExMTAy8sLpqamGDp0qLgoWSaTYceOHThw4AC2b9+OefPmYezYsTh06BCqVauG77//HoMHD0ZsbCzWrVuHcePGYceOHXj33XeRmZmJiRMnolOnToX6VSgUcHJywsWLF7Fz507s2LEDn332GWbMmIG//voLhoaGb/xaEJV3XGBLpCNMTU3h5uaGqlWrFuudeL169XD58mVUqlQJbm5uKoelpSUsLS3h4OCAQ4cOidfk5eXh2LFjRbbp5eUFpVKJv/76S+35gpGd/Px8sczT0xNGRka4ceNGoTicnJwAAB4eHjh8+LBKWwcPHnzl/bVq1Qo2NjaYPn262vNFbZ/ev38/OnTogJ49e8Lb2xvVq1cvtM1ZIpGgUaNGmDhxIk6cOAG5XI5ffvlFPF+3bl2MGTMGBw4cwDvvvIO1a9cCeP6aX7x4sdB9urm5QSp9/t+psbEx2rdvj2+++QZ79uxBfHw8Tp8+/cp7JaJXY7JCpKd69OgBGxsbdOjQAfv27UNiYiL27NmDwYMH49atWwCAIUOG4KuvvsLmzZtx4cIFfPbZZ698RoqLiwtCQ0PxySefYPPmzWKbP//8MwDA2dkZEokEv//+O9LS0pCZmQlzc3OMGDECw4YNw8qVK3H16lUcP34c8+bNw8qVKwEAn376KS5fvoyRI0fi4sWLWLt2LVasWPHK+zM1NcXSpUuxdetWfPDBB9i5cyeuX7+Oo0ePYtSoUfj000/VXlejRg1x5OT8+fMYOHAgUlJSxPOHDh3CtGnTcPToUdy4cQObNm1CWloaPDw8kJiYiDFjxiA+Ph5JSUnYvn07Ll++DA8PDwDAhAkT8MMPP2DixIk4e/Yszp8/j59++gnjxo0DAKxYsQLLli3DmTNncO3aNaxevRrGxsZwdnYu1veUiIpQ1otmiEh1ga0m5+/evSv07t1bsLGxEYyMjITq1asL/fv3Fx49eiQIwvMFtUOGDBEsLCyEChUqCBEREULv3r2LXGArCILw9OlTYdiwYYKDg4Mgl8sFNzc3Yfny5eL5SZMmCfb29oJEIhFCQ0MFQXi+KDgmJkZwd3cXDA0NBVtbWyE4OFj466+/xOt+++03wc3NTTAyMhIaN24sLF++/LULYwVBEI4cOSJ06tRJsLW1FYyMjAQ3NzdhwIABwuXLlwVBKLzA9t69e0KHDh0EMzMzoVKlSsK4ceNU7vncuXNCcHCw2F7NmjWFefPmCYIgCMnJyUJISIh4787OzsKECROE/Px8MZ7Y2FihYcOGgrGxsWBhYSE0aNBAWLx4sSAIgvDLL78I/v7+goWFhWBqaiq8++67ws6dO195f0T0ehJBeMNVbERERERvAaeBiIiISKcxWSEiIiKdxmSFiIiIdBqTFSIiItJpTFaIiIhIpzFZISIiIp3GZIWIiIh0GpMVIiIi0mlMVoiIiEinMVkhIiIincZkhYiIiHQakxUiIiLSaf8Hty1MGgoaySIAAAAASUVORK5CYII=",
                        "text/plain": [
                            "<Figure size 640x480 with 2 Axes>"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "true_labels = df[\"true_value\"].map(HUMAN_VS_AI_PROMPT_RAILS_MAP).tolist()\n",
                "\n",
                "print(classification_report(true_labels, relevance_classifications, labels=rails))\n",
                "confusion_matrix = ConfusionMatrix(\n",
                "    actual_vector=true_labels, predict_vector=relevance_classifications, classes=rails\n",
                ")\n",
                "confusion_matrix.plot(\n",
                "    cmap=plt.colormaps[\"Blues\"],\n",
                "    number_label=True,\n",
                "    normalized=True,\n",
                ")"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## Preview: Running with GPT-4 Turbo"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 17,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
                    ]
                },
                {
                    "data": {
                        "application/vnd.jupyter.widget-view+json": {
                            "model_id": "20ae2cce91384ca28b47384639465e2c",
                            "version_major": 2,
                            "version_minor": 0
                        },
                        "text/plain": [
                            "llm_classify |          | 0/119 (0.0%) | ⏳ 00:00<? | ?it/s"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "model = OpenAIModel(model_name=\"gpt-4-turbo-preview\")\n",
                "relevance_classifications = llm_classify(\n",
                "    dataframe=df,\n",
                "    template=HUMAN_VS_AI_PROMPT_TEMPLATE,\n",
                "    model=model,\n",
                "    rails=list(HUMAN_VS_AI_PROMPT_RAILS_MAP.values()),\n",
                "    concurrency=50,\n",
                ")[\"label\"].tolist()"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 18,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "              precision    recall  f1-score   support\n",
                        "\n",
                        "     correct       0.88      0.73      0.80        78\n",
                        "   incorrect       0.59      0.82      0.69        39\n",
                        "\n",
                        "   micro avg       0.75      0.76      0.75       117\n",
                        "   macro avg       0.73      0.78      0.74       117\n",
                        "weighted avg       0.78      0.76      0.76       117\n",
                        "\n"
                    ]
                },
                {
                    "data": {
                        "text/plain": [
                            "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
                        ]
                    },
                    "execution_count": 18,
                    "metadata": {},
                    "output_type": "execute_result"
                },
                {
                    "data": {
                        "image/png": "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hqu8vLwwffp0/PPPP/j55591FRMRERG9RpGXLevgDrhvi07m1hgZGSEoKAhbtmzRRXVEREREkje63T4RERGVPMPoFyk6Q1m1RERERC8oqfuszJ8/H+7u7jA1NUXDhg1x9OjRQp33yy+/QCaTISgoSOs2mawQERFRoaxduxahoaEICwvDyZMnUbt2bbRs2RJJSUmvPO/mzZsYPnw4Gjdu/EbtMlkhIiIyQCWxdHn27Nno378/QkJC4O3tjYULF8Lc3BzLly8v8JycnBz06NEDEyZMQOXKld/oWpmsEBERGSC5jrbCysrKwokTJxAYGPhvDHI5AgMDERMTU+B5EydOhKOjI/r27atFa+o4wZaIiKiUS0tLU3utVCqhVCrVylJSUpCTkwMnJye1cicnJ1y6dEljvX///TeWLVuG2NjYIsXHnhUiIiIDpMthIFdXV9jY2EhbREREkeN7/PgxevXqhSVLlsDe3r5IdbFnhYiIyADp4g60eeffvn0b1tbWUvnLvSoAYG9vDyMjIyQmJqqVJyYmwtnZOd/x169fx82bN9GuXTupTKVSAQCMjY1x+fJleHh4FCpO9qwQERGVctbW1mqbpmRFoVCgXr16iI6OlspUKhWio6Ph7++f7/hq1arh7NmziI2NlbaPPvoITZs2RWxsLFxdXQsdH3tWiIiIDJAuHkSo7fmhoaEIDg6Gn58fGjRogMjISGRkZCAkJAQA0Lt3b5QvXx4REREwNTVFzZo11c4vU6YMAOQrfx0mK0RERAZI29U8BdWhjS5duiA5ORnjx49HQkICfH19sX37dmnS7a1btyCX637QhskKERGRASqJnhUAGDRoEAYNGqRx3969e195blRUlNbtAZyzQkRERHqOPStEREQGSJergfQdkxUiIiID9KYPIny5DkPAYSAiIiLSa+xZISIiMkByyCAv4kBOUc9/W5isEBERGSAOAxERERHpCfasEBERGSDZ//4VtQ5DwGSFiIjIAHEYiIiIiEhPsGeFiIjIAMl0sBqIw0BERERUbErTMBCTFSIiIgNUmpIVzlkhIiIivcaeFSIiIgPEpctERESk1+Sy3K2odRgCDgMRERGRXmPPChERkQHiMBARERHpNa4GIiIiItIT7FkhIiIyQDIUfRjHQDpWmKwQEREZIq4GIiIiItITJdqzEhAQAF9fX0RGRpZkGKSnlvy6D/NWRSPpfhpqVimPaSM+Rr0a7hqPvXj9HiIW/YHYS7dx+94DTBnaCZ93b6p2TK2PxuP2vQf5zu3buTFmjuoCAIj7Jxnj5m7C4dgbyHqejeb+1TFt+MdwLGud77zMrOcI7DMT567ewf5V/wcfrwrSvk27TmL2jztw/VYSytpaov8nTfB1r8AivBv0X9Tv4/fxVc/mcCxrjXNX72DUjHU4eSG+wOM/6xaATzs1RgUnWzxIzcBv0acwcf4WZGZlAwCG9mmBtk1ro4qbE55lPsfRMzcQ/v1vuBafJNWhVBjj2yEd0fGDelAojPHX4YsYPm0tkh88lo55eOz7fG33/eZHbNx1AgDgVNYa3w7pCN/qFVHZ1R6L1u7DN7M36OptoUIqTauBSrRnZePGjZg0aVJJhlBs3N3dmYQVwcadJzA2chNG9fsQe1eOQs0q5dHpq/lqP1Bf9PRZFtzK2yNs0Edw0pBYAMBfK0bg0p9TpG3T94MAAEGBdQAAGU8z0XHQfMggw28LvsKfS4ci63kOuoUugkqlyldf2He/wdnBJl/5roPnMWBcFEI6vYdDv4zBzFFdsGDNX1j86743fTvoP6jDB3Xx7ZAOmLb0TwT0moZzV+9gw7wvYW9rqfH4zi39EPZle0xf8icafvItvpq0Gh0+qIdxX3wkHfNuXU8sXbcfLT6diY6DvoeJsRE2zhsEc1OFdMyUoZ3QqnFN9Bm9DG0HRsLZ3gYrp/fL194XE1bCq9Voadu677S0T6EwRsqjx5i5fDvOXb2jw3eFtJG3GqiomyEo0WTFzs4OVlZWJdb+8+fP85VlZWWVQCT0sh/W/IXeQe+ix0f+qFbZBbNHd4W5qQKrtsRoPL5uDTdMGtwBnVr4QaHQ3GFob2sFJ3tradvx9zlUqmCPRnWrAACOnL6BW/fuY35YT9TwLI8anuXxQ3gvnLp4C/uPXVGra9fB89hz5CImDe6Qr521fx5Fm4Da+LRTY7hXsEfL92piaJ8WmLtiF4QQRXxn6L/ii+7N8NPmQ1jz+2FcjktAaMQvePIsCz0/8td4fINalXDkzA2s33Ect+89wJ4jl7Bh53HUq+EmHfPx1z/g5z+O4NKNBJy7egdfTFgFVxc7+FZ3BQBYW5iiZ3t/jJmzEQeOX8HpS7cxaOIqNKztAb+a7mrtpT5+iqT7j6Utr/cGAG7fe4DRszZg7bajSEt/pvs3hwpFpqPNEJRoshIQEIAhQ4YAyO2JmDJlCj799FNYWVmhYsWKWLx4sdrx//zzD7p16wY7OztYWFjAz88PR44ckfYvWLAAHh4eUCgU8PLywsqVK9XOl8lkWLBgAT766CNYWFhg8uTJCA8Ph6+vL5YuXYpKlSrB1NQUAPDo0SP069cPDg4OsLa2RrNmzXD69Gm1+n7//XfUr18fpqamsLe3R4cOHaTrio+Px9ChQyGTySAzlNRVT2Q9z0bspdsIaOAllcnlcjRp4IVjZ+N01savfx5Dj4/8pe9PZlY2ZDIZlC8kO6YKY8jlMhw+fV0qS7qfhiFTfsbCCb3V/mKV6s7KVqsDAEyVCtxNeqRxGIpKHxNjI/hWc8Xeo5elMiEE9h29jPo+lTSec/RMHHyruaKud25y4la+LD54twZ2HTxfYDvWlrk/zx6mPQEA1K5eEQoTY7V2r8Yn4va9B/nanTHyE1zbNRW7o4ajR7t33uxCiXRErybYzpo1C35+fjh16hS++OILfP7557h8Ofc/VXp6Opo0aYI7d+5gy5YtOH36NEaOHCl1z2/atAmDBw/GsGHDcO7cOQwcOBAhISHYs2ePWhvh4eHo0KEDzp49i08//RQAcO3aNWzYsAEbN25EbGwsAODjjz9GUlIS/vzzT5w4cQJ169ZF8+bN8eBB7i+brVu3okOHDmjdujVOnTqF6OhoNGjQAEDu8FaFChUwceJE3Lt3D/fu3SvwmjMzM5GWlqa2lXb3H6UjJ0cFBzv1XjcHO2sk3dfN+7N17xmkpj9F97YNpbL6Pu4wN1UgfN5vePIsCxlPMzFu7ibk5KiQkJLbrhACX0xYhZCO76GOt5vGupu9Ux1/7DmNfUcvQ6VS4Vp8IuavjgYAJKSk6iR+Mmxly1jC2Ngo37Bm8oM0jfOjAGD9juOYsmgr/lw6FEkxcxG7eQIOnriK2VE7NR4vk8kQEdoZh2Ov4+L13J9BTmWtkZn1HGnpT9WOTXqQpjZ8OnnhH/h09HJ0+PJ7/P5XLGaO6oIBXZoU5ZKpGMghg1xWxM1A+lb0auly69at8cUXXwAARo0ahTlz5mDPnj3w8vLCmjVrkJycjGPHjsHOzg4A4OnpKZ07c+ZM9OnTRzo/NDQUhw8fxsyZM9G06b8TLbt3746QkBC1drOysvDTTz/BwcEBAPD333/j6NGjSEpKglKplOrfvHkz1q9fjwEDBmDy5Mno2rUrJkyYINVTu3ZtALnDW0ZGRrCysoKzs/MrrzkiIkKtDno7Vm05hEB/b7g4lJHK7G2tEDW1L4ZNXYtFa/dBLpehU4t6qF3NFfL/re9bvHYf0p88w9A+LQqsO7hDI8TdSUHX0IV4np0DKwtTfNY1AFMXb4Ncrld/H5ABaVS3CkJDWmL4tLU4cS4elVztMXVYZwxPaYWZy7bnO37myE9Q3cMFH/afo3VbL9Z39so/MDdT4utegVi8lvOu9IkuhnEMI1XRs2SlVq1a0tcymQzOzs5ISsqdxR4bG4s6depIicrLLl68iAEDBqiVNWrUCHPnzlUr8/Pzy3eum5ublKgAwOnTp5Geno6yZcuqHff06VNcv35diqd///5aXJ1mo0ePRmhoqPQ6LS0Nrq6uRa7XkJUtYwkjI7lWf3Vq49a9B9h79DJWTs///Wv2TnWc2hyO+4/SYWwkh42VObxajoZ7i3oAgP3Hr+DY2Tg4NRqidl7T4On4uJUfFoT3hkwmw4SvgjD+i4+QeD8N9raW2Pe/bnf38mVfbpJKofuP0pGdnaNV7+GYz9rg121HsfK33HlbF67fhYWZEnO+6YZZy3eozYeaPuJjtGxcE60HROJu0iOpPPF+GpQKE1hbmqn1rjjaWSPxFb2WJ87dxMh+H0JhYoys59kFHkdUXPQqWTExMVF7LZPJpGEeMzMznbRhYWHx2rL09HS4uLhg7969+Y4tU6aMTuNRKpVS7w3lUpgYw7eaK/Ydu4w2Abm9VSqVCvuPXUG/j98vcv1rfo+Bg60VWjSqUeAxZcvkrsjYf+wykh+m48PGPgCAqcM7Y8xnbaXjElJS0emr+Vg+JSTfsmojIznKOZYBAGzYeQL1fSrB3rbkJpST/nienYPYS7fRpL4Xtu07AyD359379ati6br9Gs8xM1VApVKfoJ2To/rfuUBerjJ9xMdoE1Ab7T6bi1t376sdf/riLWQ9z0aT+l74fU8sAMDTzRGuLnavnA/mU7UCHqZmMFHRN6Woa0WvkpVXqVWrFpYuXYoHDx5o7F2pXr06Dh48iODgYKns4MGD8Pb21rqtunXrIiEhAcbGxnB3dy8wnujo6HxDSnkUCgVycnK0bptyfdG9Gb6YsBJ1qldE3RruWPDzHmQ8zZQm+n0W9hNcHGwQNqg9gNwJs5dvJAAAnj/Pxt3kRzh7+R9YmCtR2fXfXjOVSoXVvx9G1zYNYWxslK/d1VtiULWSM+xtLXH0TBxGz16PL7o1RRV3JwCAq7P6Z8/SPDfRrFTeAeWdbAHk/tX8W/QpvFevCjIzs7H698P4LfoU/lg0WMfvEhmyH9b8hR/CclebnTx/E593awoLMyVW/34YALAgvBfuJadi4vwtAIDtB87hi+5NcebyPzh+/iYqV3DAN5+1xfYDZ6UkZuaoT9C5pR+6D1+M9CfP4Fg2NzlOS3+GZ5nPkZbxDKt+i8HkoR3xMC0DjzOeYfqIj3H0zA0cP3cTANCqcU042Fnh+LmbeJb5HE0bVsPQkBb4flW0Wvw1q5YHAFiYKWFva4maVcvj+fMcXI5LeBtvH6F03WfFYJKVbt26YcqUKQgKCkJERARcXFxw6tQplCtXDv7+/hgxYgQ++eQT1KlTB4GBgfj999+xceNG7N69W+u2AgMD4e/vj6CgIEyfPh1Vq1bF3bt3pUm1fn5+CAsLQ/PmzeHh4YGuXbsiOzsb27Ztw6hRowDkrm7av38/unbtCqVSCXt7e12/Jf9pHVvUQ8qjdExZtBVJ9x/Dp2p5rP/uS2kY6J+EB5C/sMoqITkV7/ecKr3+flU0vl8VjUZ1PfHHoiFS+d6jl/FPwkP0/Ejz6oar8UmYOH8LHqY9QcVydhgW0hJfdG+mdfy/bD2C8XM3QQigvk8l/L5wcIE3tKPSadOuk7AvY4lvBraBY1krnL1yB52//vdeQhWc7aB6YWhn5vLtEEJgzOdt4eJgg/uP0rH9wDlM+uF36Zi+nXN7Hre+8JkHcu+Z8vMfuSsnv5mzASoh8NO0fmo3hcvzPDsH/T5+H5OHdoJMJkPcP8kYO2cjVmw+pFbngdWjpa/reFfEx63q49bd+6jdPkw3bxDRC2SiBG/88OIdbN3d3TFkyBBpKTMA+Pr6IigoCOHh4QCA+Ph4DBs2DLt27UJ2dja8vb0xf/58aRXOggULMHPmTNy+fRuVKlXC2LFj0atXL6k+mUyGTZs2ISgoSCoLDw/H5s2bpVVAeR4/fowxY8Zgw4YNSE5OhrOzM95//31ERERIc0rybmp34cIFWFtb4/3338eGDbl3cTx8+DAGDhyIy5cvIzMzs9D310hLS4ONjQ0S76fC2rro8zOI9JFt/UElHQJRsRA5Wcg8uwSpqcX3Mzzv90R07C1YWhWtjfTHaWjuW7FY49WFEk1WKD8mK1QaMFmh/6q3maz8paNkpZkBJCtcR0lERER6zWDmrBAREdELuBqIiIiI9BlXAxEREZFe08VTkw3l0XWcs0JERER6jT0rREREBqgUTVlhskJERGSQSlG2wmEgIiIi0mvsWSEiIjJAXA1EREREeo2rgYiIiIj0BHtWiIiIDFApml/LnhUiIiKDJNPRpqX58+fD3d0dpqamaNiwIY4ePVrgsRs3boSfnx/KlCkDCwsL+Pr6YuXKlVq3yWSFiIiICmXt2rUIDQ1FWFgYTp48idq1a6Nly5ZISkrSeLydnR3GjBmDmJgYnDlzBiEhIQgJCcGOHTu0apfJChERkQGS6eifNmbPno3+/fsjJCQE3t7eWLhwIczNzbF8+XKNxwcEBKBDhw6oXr06PDw8MHjwYNSqVQt///23Vu0yWSEiIjJAeauBiroBQFpamtqWmZmZr72srCycOHECgYGBUplcLkdgYCBiYmJeG68QAtHR0bh8+TLef/99ra6VyQoREZEB0uWUFVdXV9jY2EhbREREvvZSUlKQk5MDJycntXInJyckJCQUGGdqaiosLS2hUCjQpk0bzJs3Dx988IFW18rVQERERKXc7du3YW1tLb1WKpU6q9vKygqxsbFIT09HdHQ0QkNDUblyZQQEBBS6DiYrREREhkiHa5etra3VkhVN7O3tYWRkhMTERLXyxMREODs7F3ieXC6Hp6cnAMDX1xcXL15ERESEVskKh4GIiIgM0NueYKtQKFCvXj1ER0dLZSqVCtHR0fD39y90PSqVSuOcmFdhzwoREREVSmhoKIKDg+Hn54cGDRogMjISGRkZCAkJAQD07t0b5cuXl+a8REREwM/PDx4eHsjMzMS2bduwcuVKLFiwQKt2mawQEREZoJJ4NlCXLl2QnJyM8ePHIyEhAb6+vti+fbs06fbWrVuQy/8dtMnIyMAXX3yBf/75B2ZmZqhWrRpWrVqFLl26aBenEEJoFyoVp7S0NNjY2CDxfuprxw+JDJVt/UElHQJRsRA5Wcg8uwSpqcX3Mzzv98TRS3dhaVW0NtIfp6FBtXLFGq8ucM4KERER6TUOAxERERmiUvQkQyYrREREBuhNbpevqQ5DwGEgIiIi0mvsWSEiIjJAJbEaqKQwWSEiIjJApWjKCpMVIiIig1SKshXOWSEiIiK9xp4VIiIiA1SaVgMxWSEiIjJEOphgayC5CoeBiIiISL+xZ4WIiMgAlaL5tUxWiIiIDFIpylY4DERERER6jT0rREREBoirgYiIiEivlabb7XMYiIiIiPQae1aIiIgMUCmaX8tkhYiIyCCVomyFyQoREZEBKk0TbDlnhYiIiPQae1aIiIgMkAw6WA2kk0iKH5MVIiIiA1SKpqxwGIiIiIj0G3tWiIiIDFBpuikckxUiIiKDVHoGgjgMRERERHqNPStEREQGiMNAREREpNdKzyAQh4GIiIhIz7FnhYiIyABxGIiIiIj0Wml6NhCTFSIiIkNUiiatcM4KERER6TX2rBARERmgUtSxwmSFiIjIEJWmCbYcBiIiIiK9xp4VIiIiA8TVQERERKTfStGkFQ4DERERkV5jzwoREZEBKkUdK0xWiIiIDBFXAxERERHpCfasEBERGaSirwYylIEgJitEREQGiMNARERERHqCyQoRERHpNSYrREREBihvGKiom7bmz58Pd3d3mJqaomHDhjh69GiBxy5ZsgSNGzeGra0tbG1tERgY+MrjC8JkhYiIyADJdPRPG2vXrkVoaCjCwsJw8uRJ1K5dGy1btkRSUpLG4/fu3Ytu3bphz549iImJgaurK1q0aIE7d+5o1S6TFSIiIiqU2bNno3///ggJCYG3tzcWLlwIc3NzLF++XOPxq1evxhdffAFfX19Uq1YNS5cuhUqlQnR0tFbtMlkhIiIyQLocBkpLS1PbMjMz87WXlZWFEydOIDAwUCqTy+UIDAxETExMoWJ+8uQJnj9/Djs7O62ulckKERGRAZLpaAMAV1dX2NjYSFtERES+9lJSUpCTkwMnJye1cicnJyQkJBQq5lGjRqFcuXJqCU9h8D4rREREpdzt27dhbW0tvVYqlTpvY+rUqfjll1+wd+9emJqaanUukxUiIiJDpMMnGVpbW6slK5rY29vDyMgIiYmJauWJiYlwdnZ+5bkzZ87E1KlTsXv3btSqVUvrMDkMREREZIDe9moghUKBevXqqU2OzZss6+/vX+B506dPx6RJk7B9+3b4+fm90bWyZ4WIiIgKJTQ0FMHBwfDz80ODBg0QGRmJjIwMhISEAAB69+6N8uXLS3Nepk2bhvHjx2PNmjVwd3eX5rZYWlrC0tKy0O0yWSEiIjJAJfFsoC5duiA5ORnjx49HQkICfH19sX37dmnS7a1btyCX/ztos2DBAmRlZaFz585q9YSFhSE8PLzQ7TJZISIiMkA6nLKilUGDBmHQoEEa9+3du1ft9c2bN9+ghfyYrBARERmikspWSgAn2BIREZFeY88KERGRAXqTZ/toqsMQMFkhIiIyQCUxwbakMFnRM0IIAMDjtLQSjoSo+IicrJIOgahY5H22836WF6c0Hfye0EUdbwOTFT3z+PFjAIBnJdcSjoSIiN7U48ePYWNjUyx1KxQKODs7o4qOfk84OztDoVDopK7iIhNvI/2jQlOpVLh79y6srKwgM5T+OQOWlpYGV1fXfM/FIPqv4Gf87RJC4PHjxyhXrpza/UZ07dmzZ8jK0k0PpUKh0PpZPW8be1b0jFwuR4UKFUo6jFKnMM/FIDJk/Iy/PcXVo/IiU1NTvU8wdIlLl4mIiEivMVkhIiIivcZkhUo1pVKJsLAwKJXKkg6FqFjwM07/BZxgS0RERHqNPStERESk15isEBERkV5jskJERER6jckKEdFbEhAQgCFDhpR0GEQGh8kKkQ6Fh4fD19e3pMMgPbVx40ZMmjSppMMoFu7u7oiMjCzpMOg/iskKlToF3aL6+fPnbzkSKm3s7OxgZWVVYu1r+ozr6pbtRMWJyQoZBJVKhenTp8PT0xNKpRIVK1bE5MmTAQBnz55Fs2bNYGZmhrJly2LAgAFIT0+Xzu3Tpw+CgoIwefJklCtXDl5eXrh58yZkMhnWrl2LJk2awNTUFKtXrwYALF26FNWrV4epqSmqVauGH374QS2Wf/75B926dYOdnR0sLCzg5+eHI0eOICoqChMmTMDp06chk8kgk8kQFRX11t4j0n8vDgO5u7tjypQp+PTTT2FlZYWKFSti8eLFascX9FnLs2DBAnh4eEChUMDLywsrV65UO18mk2HBggX46KOPYGFhgcmTJ0u9f0uXLkWlSpWkW7Y/evQI/fr1g4ODA6ytrdGsWTOcPn1arb7ff/8d9evXh6mpKezt7dGhQwfpuuLj4zF06FDps0+kU4LIAIwcOVLY2tqKqKgoce3aNXHgwAGxZMkSkZ6eLlxcXETHjh3F2bNnRXR0tKhUqZIIDg6Wzg0ODhaWlpaiV69e4ty5c+LcuXMiLi5OABDu7u5iw4YN4saNG+Lu3bti1apVwsXFRSrbsGGDsLOzE1FRUUIIIR4/fiwqV64sGjduLA4cOCCuXr0q1q5dKw4dOiSePHkihg0bJmrUqCHu3bsn7t27J548eVJC7xjpoyZNmojBgwcLIYRwc3MTdnZ2Yv78+eLq1asiIiJCyOVycenSJSHEqz9rQgixceNGYWJiIubPny8uX74sZs2aJYyMjMRff/0ltQdAODo6iuXLl4vr16+L+Ph4ERYWJiwsLESrVq3EyZMnxenTp4UQQgQGBop27dqJY8eOiStXrohhw4aJsmXLivv37wshhPjjjz+EkZGRGD9+vLhw4YKIjY0VU6ZMEUIIcf/+fVGhQgUxceJE6bNPpEtMVkjvpaWlCaVSKZYsWZJv3+LFi4Wtra1IT0+XyrZu3SrkcrlISEgQQuQmK05OTiIzM1M6Ji9ZiYyMVKvPw8NDrFmzRq1s0qRJwt/fXwghxKJFi4SVlZX0A/xlYWFhonbt2m90nfTf93Ky0rNnT2mfSqUSjo6OYsGCBUKI13/W3n33XdG/f3+1so8//li0bt1aeg1ADBkyRO2YsLAwYWJiIpKSkqSyAwcOCGtra/Hs2TO1Yz08PMSiRYuEEEL4+/uLHj16FHhtbm5uYs6cOQXuJyoKDgOR3rt48SIyMzPRvHlzjftq164NCwsLqaxRo0ZQqVS4fPmyVObj4wOFQpHvfD8/P+nrjIwMXL9+HX379oWlpaW0ffvtt7h+/ToAIDY2FnXq1IGdnZ0uL5FKqVq1aklfy2QyODs7IykpCcDrP2sXL15Eo0aN1MoaNWqEixcvqpW9+BnP4+bmBgcHB+n16dOnkZ6ejrJly6p99uPi4tQ++5r+DxK9DcYlHQDR65iZmRW5jheTmYLK8+a5LFmyBA0bNlQ7zsjISGexEOUxMTFRey2TyaBSqQDo7rOm6bP/cll6ejpcXFywd+/efMeWKVNGp/EQvQn2rJDeq1KlCszMzBAdHZ1vX/Xq1XH69GlkZGRIZQcPHoRcLoeXl5dW7Tg5OaFcuXK4ceMGPD091bZKlSoByP1LODY2Fg8ePNBYh0KhQE5OjlbtEmnyus9a9erVcfDgQbWygwcPwtvbW+u26tati4SEBBgbG+f77Nvb20vxaPo/mIeffSpOTFZI75mammLUqFEYOXIkfvrpJ1y/fh2HDx/GsmXL0KNHD5iamiI4OBjnzp3Dnj178NVXX6FXr15wcnLSuq0JEyYgIiIC3333Ha5cuYKzZ8/ixx9/xOzZswEA3bp1g7OzM4KCgnDw4EHcuHEDGzZsQExMDIDcFR5xcXGIjY1FSkoKMjMzdfpeUOnxus/aiBEjEBUVhQULFuDq1auYPXs2Nm7ciOHDh2vdVmBgIPz9/REUFISdO3fi5s2bOHToEMaMGYPjx48DAMLCwvDzzz8jLCwMFy9exNmzZzFt2jSpDnd3d+zfvx937txBSkqKbt4Eov9hskIGYdy4cRg2bBjGjx+P6tWro0uXLkhKSoK5uTl27NiBBw8eoH79+ujcuTOaN2+O77///o3a6devH5YuXYoff/wRPj4+aNKkCaKioqSeFYVCgZ07d8LR0RGtW7eGj48Ppk6dKg0TderUCa1atULTpk3h4OCAn3/+WWfvAZUur/usBQUFYe7cuZg5cyZq1KiBRYsW4ccff0RAQIDWbclkMmzbtg3vv/8+QkJCULVqVXTt2hXx8fFS0h8QEIB169Zhy5Yt8PX1RbNmzXD06FGpjokTJ+LmzZvw8PBQmw9DpAsyIYQo6SCIiIiICsKeFSIiItJrTFaIiIhIrzFZISIiIr3GZIWIiIj0GpMVIiIi0mtMVoiIiEivMVkhIiIivcZkhaiU6dOnD4KCgqTXAQEBGDJkyFuPY+/evZDJZHj06JFe1ENE+ovJCpEe6NOnD2QyGWQyGRQKBTw9PTFx4kRkZ2cXe9sbN27EpEmTCnVsSSQGp06dwscffwwnJyeYmpqiSpUq6N+/P65cufLWYiCiksVkhUhPtGrVCvfu3cPVq1cxbNgwhIeHY8aMGRqPzcrK0lm7dnZ2sLKy0ll9uvTHH3/gnXfeQWZmJlavXo2LFy9i1apVsLGxwbhx40o6PCJ6S5isEOkJpVIJZ2dnuLm54fPPP0dgYCC2bNkC4N+hm8mTJ6NcuXLSE6Vv376NTz75BGXKlIGdnR3at2+PmzdvSnXm5OQgNDQUZcqUQdmyZTFy5Ei8/ISNl4eBMjMzMWrUKLi6ukKpVMLT0xPLli3DzZs30bRpUwCAra0tZDIZ+vTpAwBQqVSIiIhApUqVYGZmhtq1a2P9+vVq7Wzbtg1Vq1aFmZkZmjZtqhanJk+ePEFISAhat26NLVu2IDAwEJUqVULDhg0xc+ZMLFq0SON59+/fR7du3VC+fHmYm5vDx8cn3zOa1q9fDx8fH5iZmaFs2bIIDAyUnty9d+9eNGjQABYWFihTpgwaNWqE+Ph46dzffvsNdevWhampKSpXrowJEyZIPWBCCISHh6NixYpQKpUoV64cvv7661deJxG9nnFJB0BEmpmZmeH+/fvS6+joaFhbW2PXrl0AgOfPn6Nly5bw9/fHgQMHYGxsjG+//RatWrXCmTNnoFAoMGvWLERFRWH58uWoXr06Zs2ahU2bNqFZs2YFttu7d2/ExMTgu+++Q+3atREXF4eUlBS4urpiw4YN6NSpEy5fvgxra2uYmZkBACIiIrBq1SosXLgQVapUwf79+9GzZ084ODigSZMmuH37Njp27Igvv/wSAwYMwPHjxzFs2LBXXv+OHTuQkpKCkSNHatxfpkwZjeXPnj1DvXr1MGrUKFhbW2Pr1q3o1asXPDw80KBBA9y7dw/dunXD9OnT0aFDBzx+/BgHDhyAEALZ2dkICgpC//798fPPPyMrKwtHjx6FTCYDABw4cAC9e/fGd999h8aNG+P69esYMGAAgNynEm/YsAFz5szBL7/8gho1aiAhIQGnT59+5XUSUSEIIipxwcHBon379kIIIVQqldi1a5dQKpVi+PDh0n4nJyeRmZkpnbNy5Urh5eUlVCqVVJaZmSnMzMzEjh07hBBCuLi4iOnTp0v7nz9/LipUqCC1JYQQTZo0EYMHDxZCCHH58mUBQOzatUtjnHv27BEAxMOHD6WyZ8+eCXNzc3Ho0CG1Y/v27Su6desmhBBi9OjRwtvbW23/qFGj8tX1omnTpgkA4sGDBxr3vyqml7Vp00YMGzZMCCHEiRMnBABx8+bNfMfdv39fABB79+7VWE/z5s3FlClT1MpWrlwpXFxchBBCzJo1S1StWlVkZWW9MmYi0g57Voj0xB9//AFLS0s8f/4cKpUK3bt3R3h4uLTfx8cHCoVCen369Glcu3Yt33yTZ8+e4fr160hNTcW9e/fQsGFDaZ+xsTH8/PzyDQXliY2NhZGREZo0aVLouK9du4YnT57ggw8+UCvPyspCnTp1AAAXL15UiwMA/P39X1lvQTG+Tk5ODqZMmYJff/0Vd+7cQVZWFjIzM2Fubg4AqF27Npo3bw4fHx+0bNkSLVq0QOfOnWFraws7Ozv06dMHLVu2xAcffIDAwEB88skncHFxAZD7nh88eBCTJ09Wa+/Zs2d48uQJPv74Y0RGRqJy5cpo1aoVWrdujXbt2sHYmD9qiYqC/4OI9ETTpk2xYMECKBQKlCtXLt8vOAsLC7XX6enpqFevHlavXp2vLgcHhzeKIW9YRxvp6ekAgK1bt6J8+fJq+5RK5RvFAQBVq1YFAFy6dOm1ic2LZsyYgblz5yIyMhI+Pj6wsLDAkCFDpEnJRkZG2LVrFw4dOoSdO3di3rx5GDNmDI4cOYJKlSrhxx9/xNdff43t27dj7dq1GDt2LHbt2oV33nkH6enpmDBhAjp27JivXVNTU7i6uuLy5cvYvXs3du3ahS+++AIzZszAvn37YGJi8sbvBVFpxwm2RHrCwsICnp6eqFixYqH+Eq9bty6uXr0KR0dHeHp6qm02NjawsbGBi4sLjhw5Ip2TnZ2NEydOFFinj48PVCoV9u3bp3F/Xs9OTk6OVObt7Q2lUolbt27li8PV1RUAUL16dRw9elStrsOHD7/y+lq0aAF7e3tMnz5d4/6Clk8fPHgQ7du3R8+ePVG7dm1Urlw53zJnmUyGRo0aYcKECTh16hQUCgU2bdok7a9Tpw5Gjx6NQ4cOoWbNmlizZg2A3Pf88uXL+a7T09MTcnnuj1MzMzO0a9cO3333Hfbu3YuYmBicPXv2lddKRK/GZIXIQPXo0QP29vZo3749Dhw4gLi4OOzduxdff/01/vnnHwDA4MGDMXXqVGzevBmXLl3CF1988cp7pLi7uyM4OBiffvopNm/eLNX566+/AgDc3Nwgk8nwxx9/IDk5Genp6bCyssLw4cMxdOhQrFixAtevX8fJkycxb948rFixAgDw2Wef4erVqxgxYgQuX76MNWvWICoq6pXXZ2FhgaVLl2Lr1q346KOPsHv3bty8eRPHjx/HyJEj8dlnn2k8r0qVKlLPycWLFzFw4EAkJiZK+48cOYIpU6bg+PHjuHXrFjZu3Ijk5GRUr14dcXFxGD16NGJiYhAfH4+dO3fi6tWrqF69OgBg/Pjx+OmnnzBhwgScP38eFy9exC+//IKxY8cCAKKiorBs2TKcO3cON27cwKpVq2BmZgY3N7dCfU+JqAAlPWmGiNQn2Gqz/969e6J3797C3t5eKJVKUblyZdG/f3+RmpoqhMidUDt48GBhbW0typQpI0JDQ0Xv3r0LnGArhBBPnz4VQ4cOFS4uLkKhUAhPT0+xfPlyaf/EiROFs7OzkMlkIjg4WAiROyk4MjJSeHl5CRMTE+Hg4CBatmwp9u3bJ533+++/C09PT6FUKkXjxo3F8uXLXzsxVgghjh07Jjp27CgcHByEUqkUnp6eYsCAAeLq1atCiPwTbO/fvy/at28vLC0thaOjoxg7dqzaNV+4cEG0bNlSqq9q1api3rx5QgghEhISRFBQkHTtbm5uYvz48SInJ0eKZ/v27eLdd98VZmZmwtraWjRo0EAsXrxYCCHEpk2bRMOGDYW1tbWwsLAQ77zzjti9e/crr4+IXk8mxBvOYiMiIiJ6CzgMRERERHqNyQoRERHpNSYrREREpNeYrBAREZFeY7JCREREeo3JChEREek1JitERESk15isEBERkV5jskJERER6jckKERER6TUmK0RERKTXmKwQERGRXvt/yIBYBL9JuhAAAAAASUVORK5CYII=",
                        "text/plain": [
                            "<Figure size 640x480 with 2 Axes>"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "true_labels = df[\"true_value\"].map(HUMAN_VS_AI_PROMPT_RAILS_MAP).tolist()\n",
                "\n",
                "print(classification_report(true_labels, relevance_classifications, labels=rails))\n",
                "confusion_matrix = ConfusionMatrix(\n",
                "    actual_vector=true_labels, predict_vector=relevance_classifications, classes=rails\n",
                ")\n",
                "confusion_matrix.plot(\n",
                "    cmap=plt.colormaps[\"Blues\"],\n",
                "    number_label=True,\n",
                "    normalized=True,\n",
                ")"
            ]
        }
    ],
    "metadata": {
        "kernelspec": {
            "display_name": "Python 3 (ipykernel)",
            "language": "python",
            "name": "python3"
        },
        "language_info": {
            "codemirror_mode": {
                "name": "ipython",
                "version": 3
            },
            "file_extension": ".py",
            "mimetype": "text/x-python",
            "name": "python",
            "nbconvert_exporter": "python",
            "pygments_lexer": "ipython3",
            "version": "3.10.3"
        }
    },
    "nbformat": 4,
    "nbformat_minor": 4
}
